package l1j.server.server.model;

import l1j.server.server.utils.IntRange;

/**
 * heading치의 정수 클래스 상하 좌우는 좌표를 기준으로서 표현한 것으로, 게임 화면을 기준으로 한 것은 아니다.
 * 
 */
public class Heading {
	/**
	 * 좌표상에서 윗방향을 나타낸다. X, Y-1
	 */
	public static final int UP = 0;
	/**
	 * 좌표상에서 우상 방향을 나타낸다. X+1, Y-1
	 */
	public static final int UP_RIGHT = 1;
	/**
	 * 좌표상에서 우측향을 나타낸다. X+1, Y
	 */
	public static final int RIGHT = 2;
	/**
	 * 좌표상에서 우하 방향을 나타낸다. X+1, Y+1
	 */
	public static final int DOWN_RIGHT = 3;
	/**
	 * 좌표상에서 아래방향을 나타낸다. X+1, Y+1
	 */
	public static final int DOWN = 4;
	/**
	 * 좌표상에서 좌하 방향을 나타낸다. X-1, Y+1
	 */
	public static final int DOWN_LEFT = 5;
	/**
	 * 좌표상에서 좌방향을 나타낸다. X-1, Y
	 */
	public static final int LEFT = 6;
	/**
	 * 좌표상에서 좌상 방향을 나타낸다. X-1, Y-1
	 */
	public static final int UP_LEFT = 7;

	private static void ensureHeading(int heading) {
		if (! IntRange.includes(heading, 0, 7)) {
			throw new IllegalArgumentException();
		}
	}

	public static Integer rotateLeft(int heading) {
		ensureHeading(heading);
		heading--;
		return heading == -1 ?  7 : heading;

	}

	public static Integer rotateRight(int heading) {
		ensureHeading(heading);
		heading++;
		return heading == 8 ?  0 : heading;
	}
}
